/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SemanticoPacote;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Loreno
 */
public class cmdCondicional {

    public void comandoCondicional(TabelaSimbolos tabelasimbolos) {

        /*
         <cmdCondicional> ::= if ( (<expLogica> | <boolean>) ) ( <cmd> | { {<cmd>} } )
                                { else if ( (<expLogica> | <boolean>) )  ( <cmd> | { {<cmd>} } ) }
                                [ else  ( <cmd> | { {<cmd>} } ) ]
        */

        String escopoIf = tabelasimbolos.getEscopo();

        while(tabelasimbolos.getLookahead().equals("if"))
        {
            tabelasimbolos.soConsome(); //if
            tabelasimbolos.soConsome(); //(

            if(tabelasimbolos.getLookahead().equals("true") || tabelasimbolos.getLookahead().equals("false"))
            {
                tabelasimbolos.soConsome();// consome o boolean
            }
            else
                ExpressaoLogica.expLogica(tabelasimbolos, escopoIf);

           tabelasimbolos.soConsome();//consome o )

           if(tabelasimbolos.getLookahead().equals("{"))
           {
               tabelasimbolos.soConsome();//consome {
               miolo(tabelasimbolos, escopoIf);//mais de uma instrução
               tabelasimbolos.soConsome();//consome }
           }
           else
               miolo2(tabelasimbolos, escopoIf);//uma instrução

           if(tabelasimbolos.getLookahead().equals("else"))
           {
               tabelasimbolos.soConsome();//consome o else

               if(!tabelasimbolos.getLookahead().equals("if"))
               {
                   if(tabelasimbolos.getLookahead().equals("{"))
                    {
                        tabelasimbolos.soConsome();//consome {
                        miolo(tabelasimbolos, escopoIf);//mais de uma instrução
                        tabelasimbolos.soConsome();//consome }
                    }
                    else
                        miolo2(tabelasimbolos, escopoIf);//uma instrução
               }
           }
        }

    }

    public void miolo(TabelaSimbolos tabelasimbolos, String escopo)
    {

        chamadaDeFuncao cf = new chamadaDeFuncao(tabelasimbolos);
        ExpAtribuicao ea = new ExpAtribuicao();
        entradaDeDados ed = new entradaDeDados();
        saidaNaTela st = new saidaNaTela();
        cmdRepeticao cr = new cmdRepeticao();

        while (!tabelasimbolos.getLookahead().equals("}")) {

            if (tabelasimbolos.getTipo().equals("identificador")) {
                if (tabelasimbolos.superLookahead(1).equals("(")) {
                    if (cf.chamaFuncao());

                } else if (tabelasimbolos.superLookahead(1).equals("++") ||
                           tabelasimbolos.superLookahead(1).equals("--") ||
                           tabelasimbolos.superLookahead(1).equals("=")) {
                    ea.expatribuicao(tabelasimbolos, escopo);
                }

            } else if (tabelasimbolos.getLookahead().equals("*")) {
                ea.expatribuicao(tabelasimbolos, escopo);

            } else if (tabelasimbolos.getLookahead().equals("scanf")) {
               ed.entradadados(tabelasimbolos);

            } else if (tabelasimbolos.getLookahead().equals("printf")) {
               st.saidaTela(tabelasimbolos);

            } else if (tabelasimbolos.getLookahead().equals("if")) {
               comandoCondicional(tabelasimbolos);

            } else if (tabelasimbolos.getLookahead().equals("while") ||
                       tabelasimbolos.getLookahead().equals("do") ||
                       tabelasimbolos.getLookahead().equals("for")) {
               cr.comandoRepeticao(tabelasimbolos, escopo);
            }
        }
    }
    
    public void miolo2(TabelaSimbolos tabelasimbolos, String escopo)
    {
        chamadaDeFuncao cf = new chamadaDeFuncao(tabelasimbolos);
        ExpAtribuicao ea = new ExpAtribuicao();
        entradaDeDados ed = new entradaDeDados();
        saidaNaTela st = new saidaNaTela();
        cmdRepeticao cr = new cmdRepeticao();
        
        if (tabelasimbolos.getTipo().equals("identificador")) {
            if (tabelasimbolos.superLookahead(1).equals("(")) {
                if (cf.chamaFuncao());

            } else if (tabelasimbolos.superLookahead(1).equals("++") ||
                       tabelasimbolos.superLookahead(1).equals("--") ||
                       tabelasimbolos.superLookahead(1).equals("=")) {
                ea.expatribuicao(tabelasimbolos, escopo);
            }

         } else if (tabelasimbolos.getLookahead().equals("*")) {
            ea.expatribuicao(tabelasimbolos, escopo);

         } else if (tabelasimbolos.getLookahead().equals("scanf")) {
            ed.entradadados(tabelasimbolos);

         } else if (tabelasimbolos.getLookahead().equals("printf")) {
            st.saidaTela(tabelasimbolos);

         } else if (tabelasimbolos.getLookahead().equals("if")) {
            comandoCondicional(tabelasimbolos);

         } else if (tabelasimbolos.getLookahead().equals("while") ||
                    tabelasimbolos.getLookahead().equals("do") ||
                    tabelasimbolos.getLookahead().equals("for")) {
            cr.comandoRepeticao(tabelasimbolos, escopo);
         }
    }
}
